package com.vdong.redis.data.core.json.ops;

import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.connection.RedisZSetCommands.Limit;
import org.springframework.data.redis.connection.RedisZSetCommands.Range;
import org.springframework.data.redis.core.BoundZSetOperations;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.data.redis.core.ZSetOperations.TypedTuple;

import java.util.Collection;
import java.util.Date;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * ops覆盖接口，用于动态代理
* @author <a href="mailto:zhudelie@zuozh.com">zhudelie</a>
* @version 
* @since JDK 1.6
* create on 2017年3月31日
* Copyright 2017 ZZJR All Rights Reserved.
*
*/
public interface FastJsonBoundZSetOperations<K,V> extends BoundZSetOperations<K,V> {
	/**
	 * 获得key
	 */
	
	K getKey();
	/**
	 * 获得类型
	 */
	
	DataType getType();
	/**
	 * 获得过期时间
	 */
	
	Long getExpire();
	/**
	 * 设置过期时间
	 */
	
	Boolean expire(long timeout, TimeUnit unit);
	/**
	 * 设置过期时间
	 */
	
	Boolean expireAt(Date date);
	/**
	 * 取消过期时间
	 */
	
	Boolean persist();
	/**
	 * 重命名
	 */
	
	void rename(K newKey);
	/**
	 * 添加值
	 */
	
	Boolean add(V value, double score);
	/**
	 * 添加多个值
	 */
	
	Long add(Set<TypedTuple<V>> tuples);
	/**
	 * 删除多个值
	 */
	
	Long remove(Object... values);
	/**
	 * 添加单位成员的有序集合存储增量键比分
	 */
	
	Double incrementScore(V value, double delta);
	/**
	 * 返回成员的有序集合保存在key，由低到高的分数顺序排名
	 */
	
	Long rank(Object o);
	/**
	 * 返回有序集中成员的排名。其中有序集成员按分数值递减(从大到小)排序
	 */
	
	Long reverseRank(Object o);
	/**
	 * 取有序集中第start位到end位的元素
	 */
	
	Set<V> range(long start, long end);
	/**
	 * 取有序集中第start位到end位的元素，返回TypedTuple，包含score
	 */
	
	Set<TypedTuple<V>> rangeWithScores(long start, long end);
	/**
	 * 取有序集中分数为min到max的元素
	 */
	
	Set<V> rangeByScore(double min, double max);
	/**
	 * 取有序集中分数为min到max的元素，返回TypedTuple，包含score
	 */
	
	Set<TypedTuple<V>> rangeByScoreWithScores(double min, double max);
	/**
	 * 对start到end的元素进行倒序，并返回
	 */
	
	Set<V> reverseRange(long start, long end);
	/**
	 * 对start到end的元素进行倒序，并返回TypedTuple，包含score
	 */
	
	Set<TypedTuple<V>> reverseRangeWithScores(long start, long end);
	/**
	 * 对分数为min到max的元素进行倒序
	 */
	
	Set<V> reverseRangeByScore(double min, double max);
	/**
	 * 对分数为min到max的元素进行倒序，并返回TypedTuple，包含score
	 */
	
	Set<TypedTuple<V>> reverseRangeByScoreWithScores(double min, double max);
	/**
	 * 统计分数值在min到max范围内的元素个数
	 */
	
	Long count(double min, double max);
	/**
	 * 元素个数
	 */
	
	Long size();
	/**
	 * 元素个数
	 */
	
	Long zCard();
	/**
	 * 指定元素的分数
	 */
	
	Double score(Object o);
	/**
	 *删除下标start到end的元素
	 */
	
	void removeRange(long start, long end);
	/**
	 *删除分数min到max的元素
	 */
	
	void removeRangeByScore(double min, double max);
	/**
	 * 并集，如果destkey存在，则覆盖
	 */
	
	void unionAndStore(K otherKey, K destKey);
	/**
	 * 并集，如果destkey存在，则覆盖
	 */
	
	void unionAndStore(Collection<K> otherKeys, K destKey);
	/**
	 *  交集，如果destkey存在，则覆盖
	 */
	
	void intersectAndStore(K otherKey, K destKey);
	/**
	 *  交集，如果destkey存在，则覆盖
	 */
	
	void intersectAndStore(Collection<K> otherKeys, K destKey);

	
	Cursor<TypedTuple<V>> scan(ScanOptions options);
	/**
	 * 返回存储在键的排序集合在指定的范围元素。该元素被认为是从最低到最高的分值进行排序。字典顺序用于以相等的分数的元素。两个开始和结束是从零开始的索引，其中0是第一个元素，1是下一个元素等等。它们也可以是表示偏移量从有序集的结尾，以-1作为排序的集合的最后一个元素，-2倒数第二元素等负数	
	 */
	
	Set<V> rangeByLex(Range range);
	/**
	 * 返回存储在键的排序集合在指定的范围元素。该元素被认为是从最低到最高的分值进行排序。字典顺序用于以相等的分数的元素。两个开始和结束是从零开始的索引，其中0是第一个元素，1是下一个元素等等。它们也可以是表示偏移量从有序集的结尾，以-1作为排序的集合的最后一个元素，-2倒数第二元素等负数
	 */
	
	Set<V> rangeByLex(Range range, Limit limit);

	
	RedisOperations<K,V> getOperations();
	
	
}
